package com.linkstec.javabase;

import java.util.HashSet;
import java.util.Iterator;

public class EqualsHashCode {

	public static void main(String[] args) {
		HashSet<Student> hs = new HashSet<Student>();
		hs.add(new Student(1, "zhangsan"));
		hs.add(new Student(2, "lisi"));
		hs.add(new Student(3, "wangwu"));
		hs.add(new Student(1, "zhangsan"));

		System.out.println(new Student(1, "zhangsan").equals(new Student(1, "zhangsan")));

		Iterator<Student> it = hs.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

class Student {
	int num;
	String name;

	Student(int num, String name) {
		this.num = num;
		this.name = name;
	}

	public String toString() {
		return num + ":" + name;
	}

	/**
	 * 
	 * 自反性（reflexive）。对于任意不为null的引用值x，x.equals(x)一定是true。

	 * 对称性（symmetric）。对于任意不为null的引用值x和y，当且仅当x.equals(y)是true时，y.equals(x)也是true。

	 * 传递性（transitive）。对于任意不为null的引用值x、y和z，如果x.equals(y)是true，同时y.equals(z)是true，那么x.equals(z)一定是true。

	 * 一致性（consistent）。对于任意不为null的引用值x和y，如果用于equals比较的对象信息没有被修改的话，多次调用时x.equals(y)要么一致地返回true要么一致地返回false。

	 * 对于任意不为null的引用值x，x.equals(null)返回false。
	 */
	public boolean equals(Object o) {
		Student s = (Student) o;
		return num == s.num && name.equals(s.name);
	}

	/**
	 * 不重写hashcode()会存入相同的元素
	 */
	public int hashCode() {
		return num * name.hashCode();
	}
}